package utils;

import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.xml.XmlDocument;

import java.io.File;
import java.io.IOException;

public class AndroidFileUtils {

    /**
     * 获取 AndroidManifest.xml 文件
     *
     * @param project
     * @return
     */
    public static PsiFile getAndroidManifestFile(Project project) {
        // AndroidManifest.xml文件的路径，project.getBasePath() 就是项目根目录
        String path = project.getBasePath() + File.separator +
                "app" + File.separator +
                "src" + File.separator +
                "main" + File.separator +
                "AndroidManifest.xml";

        // findFileByPath 这个方法只能获取文件，不能获取目录。
        VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByPath(path);
        if (virtualFile == null) {
            return null;
        }
        // 获取到 VirtualFile 后再转换成 PsiFile，大部分操作都是针对Psi体系的.
        return PsiManager.getInstance(project).findFile(virtualFile);
    }

    /**
     * 解析 AndroidManifest.xml ，获取 package 属性值
     *
     * @param project
     * @return
     */
    public static String getAppPackageNameDir(Project project) {
        PsiFile manifestFilePsiFile = getAndroidManifestFile(project);
        XmlDocument xml = (XmlDocument) manifestFilePsiFile.getFirstChild();
        return xml.getRootTag().getAttributeValue("package");
    }

    /**
     * 获取包名目录文件
     * // app包名根目录 .../app/src/main/java/{package}
     *
     * @param project
     * @return
     */
    public static VirtualFile getAppPackageBaseDir(Project project) {
        String path = project.getBasePath() + File.separator +
                "app" + File.separator +
                "src" + File.separator +
                "main" + File.separator +
                "java" + File.separator +
                getAppPackageNameDir(project).replace(".", File.separator);
        return LocalFileSystem.getInstance().findFileByPath(path);
    }

    /**
     * 获取包名目录下面的 db 文件
     *
     * @return
     */
    public static VirtualFile getDbFile(Project project) {
        VirtualFile baseDir = getAppPackageBaseDir(project);
        VirtualFile dbDir = baseDir.findChild("db");
        if (dbDir == null) {
            // 如果不存在就创建一个
            try {
                dbDir = baseDir.createChildDirectory(null, "db");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return dbDir;
    }
}
